package tk.mybatis.simple.mapper;

import org.apache.ibatis.annotations.Param;
import tk.mybatis.simple.model.SysRole;
import tk.mybatis.simple.model.SysUser;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    /**
     * 根据用户 id 获取用户信息和用户的角色信息
     * @param id
     * @return
     */
    SysUser selectUserAndRoleById(Long id);

    /**
     * 根据用户 id 获取用户信息和用户的角色信息
     * @param id
     * @return
     */
    SysUser selectUserAndRoleById2(Long id);

    SysUser selectUserAndRoleById3(Long id);

    SysUser selectUserAndRoleByIdSelect(Long id);

    SysUser selectUserAndRoleByIdSelect1(Long id);

    /**
     * 获取所有的用户以及对应的所有角色
     * @return
     */
    List<SysUser> selectAllUserAndRoles();

    /**
     * 获取所有的用户以及对应的所有角色，加上角色对应的所有权限
     * @return
     */
    List<SysUser> selectAllUserAndRoles1();

    /**
     * 通过嵌套查询获取指定用户的信息以及用户的角色和权限信息
     * @param id
     * @return
     */
    SysUser selectAllUserAndRolesSelect(Long id);

    /**
     * 使用存储过程查询用户信息
     * 因为这个存储过程没有返回值（不要和出参混淆），所以返回值类型使用 void。把返回值设置为 SysUser 或 List 也不会报错，但是任何时候返回值都是 null。
     * @param user
     */
    void selectUserById(SysUser user);

    /**
     * 使用存储过程分页查询
     * 由于需要多个入参和一个出参，而入参中除了 userName 属性在 SysUser 中，其他 3 个参数都和 SysUser 无关，因此为了使用 SysUser 而增加 3 个属性也是可以的。这里为了实现
     * 方法多样化，也为了印证上一个方法中使用 Map 接收返回值的用法是正确的，因此使用 Map 类型作为参数。
     * @param params
     * @return
     */
    List<SysUser> selectUserPage(Map<String, Object> params);

    /**
     * 保存用户信息和角色关联信息
     * 在 insertUserAndRoles 方法中，SysUser 参数存储了用户基本信息，roleIds 参数存储了该用户的角色 id 字符串，如 “1,2,3”，注意要使用逗号隔开多个 id。
     * @param user
     * @param roleIds
     * @return
     */
    int insertUserAndRoles(@Param("user")SysUser user, @Param("roleIds")String roleIds);

    /**
     * 根据用户 id 删除用户和用户的角色信息
     * @param id
     * @return
     */
    int deleteUserById(Long id);
}
